//******************************************************************************************************
//  ChannelSelector.tsx - Gbtc
//
//  Copyright (c) 2024, Grid Protection Alliance.  All Rights Reserved.
//
//  Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
//  the NOTICE file distributed with this work for additional information regarding copyright ownership.
//  The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
//  file except in compliance with the License. You may obtain a copy of the License at:
//
//      http://opensource.org/licenses/MIT
//
//  Unless agreed to in writing, the subject software distributed under the License is distributed on an
//  "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
//  License for the specific language governing permissions and limitations.
//
//  Code Modification History:
//  ----------------------------------------------------------------------------------------------------
//  05/03/2024 - Preston Crawford / CHristoph Lackner
//       Generated original version of source code.
//
//******************************************************************************************************

import * as React from 'react';
import { DataSetTypes } from '../../global';
import { WidgetTypes } from './Interfaces';
import { Table, Column } from '@gpa-gemstone/react-table';
import { sort } from './HelperFunctions';

const ChannelSelector: React.FC<WidgetTypes.IChannelSelectionProps<unknown, unknown>> = (props) => {
    const [allChannels, setAllChannels] = React.useState<DataSetTypes.IDataSetMetaData[]>(props.AllChannels);
    const [ascending, setAscending] = React.useState<boolean>(false);
    const [sortField, setSortField] = React.useState<keyof DataSetTypes.IDataSetMetaData>('Phase');

    return (
        <Table<DataSetTypes.IDataSetMetaData>
            TableClass="table table-hover h-100"
            SortKey={sortField}
            OnClick={(item) => {
                props.SelectedChannels.forEach(chan => props.RemoveChannel(chan.MetaData.ID));
                props.AddChannel(item.row.ID, null);
            }}
            OnSort={data => sort(data.colField as keyof DataSetTypes.IDataSetMetaData, sortField, setSortField, data.ascending, setAscending, ascending, allChannels, setAllChannels)}
            Data={allChannels}
            Ascending={ascending}
            KeySelector={(row) => row.ID}
            Selected={(row) => props.SelectedChannels.find(c => c.MetaData.ID === row.ID) != null ? true : false}
        >
            <Column<DataSetTypes.IDataSetMetaData>
                Key={'ParentName'}
                AllowSort={true}
                Field={'ParentName'}
            >
                Parent
            </Column>
            <Column<DataSetTypes.IDataSetMetaData>
                Key={'Name'}
                AllowSort={true}
                Field={'Name'}
            >
                Name
            </Column>
            <Column<DataSetTypes.IDataSetMetaData>
                Key={'Type'}
                AllowSort={true}
                Field={'Type'}
            >
                Type
            </Column>
            <Column<DataSetTypes.IDataSetMetaData>
                Key={'Phase'}
                AllowSort={true}
                Field={'Phase'}
            >
                Phase
            </Column>
        </Table>);
}

export default ChannelSelector;